/**
 * 
 */
package com.sbl.bajw.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;

/**
 * @author Administrator
 *
 */
public class FileUtil {
	
	 public static final int BUFFER = 1024 ;//缓存大小  
     
	    /**
	     * zip file
	     *lrq
	     *2012-9-11
	     *TODO
	     * @param filePath the dir to zip
	     * @param resultPath the result zip file name
	     * @throws Exception
	     */
	    public static void zipFile(String filePath,String resultPath) throws Exception{  
	    	File fileDir=new File(filePath);
	    	ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(resultPath));  
	    	 File[] files = fileDir.listFiles();
             if(files != null){
                 for(int i=0;i<files.length;i++){
                     //进行递归，同时传递父文件ZipEntry的名称，还有压缩输出流
                     RecursiveZip(files[i],"",zos);
                 }
             }
	        zos.close();  
	    } 
	    
	    private static void RecursiveZip(File fDir,String pName,ZipOutputStream zos) throws IOException{
    	   if(fDir.isDirectory()){
               //如果为目录，ZipEntry名称的尾部应该以反斜杠"/"结尾
               zos.putNextEntry(new ZipEntry(pName+fDir.getName()+"/"));
               File[] files = fDir.listFiles();
               if(files != null){
                   for(int i=0;i<files.length;i++){
                       //进行递归，同时传递父文件ZipEntry的名称，还有压缩输出流
                       RecursiveZip(files[i],pName+fDir.getName()+"/",zos);
                   }
               }
           }
           if(fDir.isFile()){
               byte[] bt = new byte[BUFFER];
               ZipEntry ze = new ZipEntry(pName+fDir.getName());
               //设置压缩前的文件大小
               ze.setSize(fDir.length());
               zos.putNextEntry(ze);
               FileInputStream fis = new FileInputStream(fDir);
               int i=0;
               while((i = fis.read(bt)) != -1) {
                   zos.write(bt, 0, i);
               }
               fis.close();
           }
	    }
	    
	    @SuppressWarnings("resource")
		public static void upZipFile(String zipfile,String dir) throws Exception{  
	        ZipFile zfile=new ZipFile(zipfile); 
	        Enumeration<? extends ZipEntry> zList=zfile.entries();  
	        ZipEntry ze=null;  
	        byte[] buf=new byte[1024]; 
	        File temzipFile=new File(zipfile);
	        String zipName=temzipFile.getName();
	        File zipdir=new File(dir+"/"+zipName.substring(0, zipName.lastIndexOf(".")));
	        if(!zipdir.mkdir()){
	        	throw new Exception(zipdir.getPath()+"已存在");
	        }
	        while(zList.hasMoreElements()){  
	            ze=(ZipEntry)zList.nextElement();         
	            OutputStream os=new BufferedOutputStream(new FileOutputStream(zipdir.getPath()+"/"+ze.getName()));  
	            InputStream is=new BufferedInputStream(zfile.getInputStream(ze));  
	            int readLen=0;  
	            while ((readLen=is.read(buf, 0, 1024))!=-1) {  
	                os.write(buf, 0, readLen);  
	            }  
	            is.close();  
	            os.close();   
	        }  
	        zfile.close();  
	    }  
	    
	    public static String uploadFile(String targetURL,String filename) throws HttpException, IOException{
			   return uploadFile(targetURL,filename,"");
	    }
	    
	    public static String uploadFile(String targetURL,String filename,String receiveFolder) throws HttpException, IOException{
			   File targetFile = null;
			   targetFile = new File(filename);
			   PostMethod filePost = new PostMethod(targetURL);
	            Part[] parts = { new FilePart("file", targetFile),new StringPart("receiveFolder", receiveFolder) };
			    filePost.setRequestEntity(new MultipartRequestEntity(parts,filePost.getParams()));
			    HttpClient client = new HttpClient();
			    client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
			    int status = client.executeMethod(filePost);
			    String responText=filePost.getResponseBodyAsString();
			    filePost.releaseConnection();
			    return "http状态码："+status+"/n"+responText;
	    }
	    
	    
	    /** 
	     * 新建目录 
	     * @param folderPath String 如 c:/fqf 
	     * @return boolean 
	     */ 
	   public static void newFolder(String folderPath) { 
	       try { 
	           String filePath = folderPath; 
	           filePath = filePath.toString(); 
	           java.io.File myFilePath = new java.io.File(filePath); 
	           if (!myFilePath.exists()) { 
	               myFilePath.mkdir(); 
	           } 
	       } 
	       catch (Exception e) { 
	           System.out.println("新建目录操作出错"); 
	           e.printStackTrace(); 
	       } 
	   }

	   /** 
	     * 删除文件 
	     * @param filePathAndName String 文件路径及名称 如c:/fqf.txt 
	     * @param fileContent String 
	     * @return boolean 
	     */ 
	   public static void delFile(String filePathAndName) { 
	       try { 
	           String filePath = filePathAndName; 
	           filePath = filePath.toString(); 
	           java.io.File myDelFile = new java.io.File(filePath); 
	           myDelFile.delete();

	       } 
	       catch (Exception e) { 
	           System.out.println("删除文件操作出错"); 
	           e.printStackTrace();

	       }

	   }

	   /** 
	     * 删除文件夹 
	     * @param filePathAndName String 文件夹路径及名称 如c:/fqf 
	     * @param fileContent String 
	     * @return boolean 
	     */ 
	   public static void delFolder(String folderPath) { 
	       try { 
	           delAllFile(folderPath); //删除完里面所有内容 
	           String filePath = folderPath; 
	           filePath = filePath.toString(); 
	           java.io.File myFilePath = new java.io.File(filePath); 
	           myFilePath.delete(); //删除空文件夹

	       } 
	       catch (Exception e) { 
	           System.out.println("删除文件夹操作出错"); 
	           e.printStackTrace();

	       }

	   }

	   /** 
	     * 删除文件夹里面的所有文件 
	     * @param path String 文件夹路径 如 c:/fqf 
	     */ 
	   public static void delAllFile(String path) { 
	       File file = new File(path); 
	       if (!file.exists()) { 
	           return; 
	       } 
	       if (!file.isDirectory()) { 
	           return; 
	       } 
	       String[] tempList = file.list(); 
	       File temp = null; 
	       for (int i = 0; i < tempList.length; i++) { 
	           if (path.endsWith(File.separator)) { 
	               temp = new File(path + tempList[i]); 
	           } 
	           else { 
	               temp = new File(path + File.separator + tempList[i]); 
	           } 
	           if (temp.isFile()) { 
	               temp.delete(); 
	           } 
	           if (temp.isDirectory()) { 
	               delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件 
	               delFolder(path+"/"+ tempList[i]);//再删除空文件夹 
	           } 
	       } 
	   }

	   /** 
	     * 复制单个文件 
	     * @param oldPath String 原文件路径 如：c:/fqf.txt 
	     * @param newPath String 复制后路径 如：f:/fqf.txt 
	     * @return boolean 
	     */ 
	   public static void copyFile(String oldPath, String newPath) { 
	       try { 
	           int bytesum = 0; 
	           int byteread = 0; 
	           File oldfile = new File(oldPath); 
	           if (oldfile.exists()) { //文件存在时 
	               InputStream inStream = new FileInputStream(oldPath); //读入原文件 
	               FileOutputStream fs = new FileOutputStream(newPath); 
	               byte[] buffer = new byte[1444]; 
	               while ( (byteread = inStream.read(buffer)) != -1) { 
	                   bytesum += byteread; //字节数 文件大小 
	                   System.out.println(bytesum); 
	                   fs.write(buffer, 0, byteread); 
	               } 
	               inStream.close(); 
	               fs.close();
	           } 
	       } 
	       catch (Exception e) { 
	           System.out.println("复制单个文件操作出错"); 
	           e.printStackTrace();

	       }

	   }

	   /** 
	     * 复制整个文件夹内容 
	     * @param oldPath String 原文件路径 如：c:/fqf 
	     * @param newPath String 复制后路径 如：f:/fqf/ff 
	     * @return boolean 
	     */ 
	   public static void copyFolder(String oldPath, String newPath) {

	       try { 
	           (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹 
	           File a=new File(oldPath); 
	           String[] file=a.list(); 
	           File temp=null; 
	           for (int i = 0; i < file.length; i++) { 
	               if(oldPath.endsWith(File.separator)){ 
	                   temp=new File(oldPath+file[i]); 
	               } 
	               else{ 
	                   temp=new File(oldPath+File.separator+file[i]); 
	               }

	               if(temp.isFile()){ 
	                   FileInputStream input = new FileInputStream(temp); 
	                   FileOutputStream output = new FileOutputStream(newPath + "/" + 
	                           (temp.getName()).toString()); 
	                   byte[] b = new byte[1024 * 5]; 
	                   int len; 
	                   while ( (len = input.read(b)) != -1) { 
	                       output.write(b, 0, len); 
	                   } 
	                   output.flush(); 
	                   output.close(); 
	                   input.close(); 
	               } 
	               if(temp.isDirectory()){//如果是子文件夹 
	                   copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]); 
	               } 
	           } 
	       } 
	       catch (Exception e) { 
	           System.out.println("复制整个文件夹内容操作出错"); 
	           e.printStackTrace();

	       }

	   }

	   /** 
	     * 移动文件到指定目录 
	     * @param oldPath String 如：c:/fqf.txt 
	     * @param newPath String 如：d:/fqf.txt 
	     */ 
	   public static void moveFile(String oldPath, String newPath) { 
	       copyFile(oldPath, newPath); 
	       delFile(oldPath);

	   }

	   /** 
	     * 移动文件到指定目录 
	     * @param oldPath String 如：c:/fqf.txt 
	     * @param newPath String 如：d:/fqf.txt 
	     */ 
	   public static void moveFolder(String oldPath, String newPath) { 
	       copyFolder(oldPath, newPath); 
	       delFolder(oldPath);

	   } 
	
}